/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package produccion.vistas;

import produccion.controlador.ControladorProduccion;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import utils.Utils;

/**
 *
 * @author James
 */
public class Asignacion extends javax.swing.JInternalFrame {

    public static final int ELIMINADA = 0;
    public static final int PENDIENTE = 1;
    public static final int ACTIVA = 2;
    public static final int EN_USO = 3;
    public static final int COMPLETADA = 4;
    private ArrayList<modelos.Asignacion> listaAsignaciones;
    private ArrayList<modelos.Asignacion> listaAsignacionesBuscadas;

    public Asignacion() {
        initComponents();
        listaAsignaciones = ControladorProduccion.seleccionarAsignaciones();
        listaAsignacionesBuscadas = new ArrayList<>();
        for (int i = 0; i < listaAsignaciones.size(); i++) {
            listaAsignacionesBuscadas.add(listaAsignaciones.get(i));
        }
        dpFechaInicio.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                // the docs of JDateChooser says that when the date is modified, a "date" property change is fired
                if (evt.getPropertyName().equals("date")) {
                    dpFechaFin.setMinSelectableDate(dpFechaInicio.getDate());
                }
            }
        });
        dpFechaFin.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                // the docs of JDateChooser says that when the date is modified, a "date" property change is fired
                if (evt.getPropertyName().equals("date")) {
                    dpFechaInicio.setMaxSelectableDate(dpFechaFin.getDate());
                }
            }
        });
        tblAsignaciones.setModel(modeloTabla);
    }
    private AbstractTableModel modeloTabla = new AbstractTableModel() {
        private String[] cabeceras = {"Fecha Inicial", "Fecha Final", "Estado"};

        @Override
        public int getRowCount() {
//            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            return listaAsignacionesBuscadas.size();
        }

        @Override
        public int getColumnCount() {
//            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            return cabeceras.length;
        }

        @Override
        public String getColumnName(int columna) {
            return cabeceras[columna];
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
//            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
            Date fecha;
            int estado;
            if (columnIndex == 0) {
                fecha = listaAsignacionesBuscadas.get(rowIndex).getFechainicial(); // No se si funciona como Date asi que si no sale lo puedes cambiar a String y cambiar el getColumnClass
                return fecha;
            } else if (columnIndex == 1) {
                fecha = listaAsignacionesBuscadas.get(rowIndex).getFechafinal();
                return fecha;
            } else if (columnIndex == 2) {
                estado = listaAsignacionesBuscadas.get(rowIndex).getEstado();
                if (estado == PENDIENTE) {
                    return "Pendiente";
                } else if (estado == ACTIVA) {
                    return "Activa";
                } else if (estado == COMPLETADA) {
                    return "Completada";
                } else if (estado == EN_USO){
                    return "En Uso";
                }
            }
            return null;
        }

        @Override
        public Class<?> getColumnClass(int columna) {
            if (columna <= 1) {
                return Date.class;
            } else {
                return String.class;
            }
        }

        @Override
        public boolean isCellEditable(int row, int col) {
            return false;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }
    };

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tblAsignaciones = new javax.swing.JTable();
        jButton2 = new javax.swing.JButton();
        btnNuevo = new javax.swing.JButton();
        btnBuscar = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        cbPendiente = new javax.swing.JCheckBox();
        cbActiva = new javax.swing.JCheckBox();
        jLabel6 = new javax.swing.JLabel();
        cbCompletada = new javax.swing.JCheckBox();
        dpFechaInicio = new com.toedter.calendar.JDateChooser();
        dpFechaFin = new com.toedter.calendar.JDateChooser();
        cbEnUso = new javax.swing.JCheckBox();

        setClosable(true);
        setIconifiable(true);
        setTitle("Mantenimiento de Asignacion");

        tblAsignaciones.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"17/09/2013", "Pendiente"},
                {"16/09/2013", "Activa"},
                {"15/09/2013", "Completada"},
                {"14/09/2013", "Completada"}
            },
            new String [] {
                "Fecha", "Estado"
            }
        ));
        tblAsignaciones.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tblAsignacionesMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tblAsignaciones);

        jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/trash.png"))); // NOI18N
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        btnNuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/file plus.png"))); // NOI18N
        btnNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoActionPerformed(evt);
            }
        });

        btnBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/search.png"))); // NOI18N
        btnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarActionPerformed(evt);
            }
        });

        jLabel5.setText("Fecha Inicio:");

        jLabel7.setText("Estado:");

        cbPendiente.setSelected(true);
        cbPendiente.setText("Pendiente");

        cbActiva.setSelected(true);
        cbActiva.setText("Activa");

        jLabel6.setText("Fecha Fin:");

        cbCompletada.setSelected(true);
        cbCompletada.setText("Completada");

        dpFechaInicio.setDateFormatString("dd/MM/yyyy");

        dpFechaFin.setDateFormatString("dd/MM/yyyy");

        cbEnUso.setSelected(true);
        cbEnUso.setText("En uso");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(dpFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(dpFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel7)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbPendiente)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbActiva)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cbEnUso)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbCompletada))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(btnNuevo)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnBuscar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButton2)
                                .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnNuevo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(btnBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addGap(13, 13, 13)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel5)
                            .addComponent(dpFechaInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(dpFechaFin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 24, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel7)
                            .addComponent(cbPendiente)
                            .addComponent(cbActiva)
                            .addComponent(cbCompletada)
                            .addComponent(cbEnUso))
                        .addGap(10, 10, 10)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(28, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel6)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoActionPerformed
        AsignacionNueva asignacion = new AsignacionNueva();
        getDesktopPane().add(asignacion);
        asignacion.setVisible(true);
    }//GEN-LAST:event_btnNuevoActionPerformed

    private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarActionPerformed
        //SI QUERIAS HACERLO CON BASE DE DATOS MODIFICALO XD SOLO CONTINUARIAN LOS MISMO IF XD 
        buscarAsignaciones();
        RefrescarTabla();
    }//GEN-LAST:event_btnBuscarActionPerformed

    public void buscarAsignaciones() {
        boolean activa = cbActiva.isSelected();
        boolean completada = cbCompletada.isSelected();
        boolean pendiente = cbPendiente.isSelected();
        boolean enUso = cbEnUso.isSelected();
        modelos.Asignacion asignacion;

        listaAsignacionesBuscadas = new ArrayList<>();
        for (int i = 0; i < listaAsignaciones.size(); i++) {
            asignacion = listaAsignaciones.get(i);
            if ((dpFechaFin.getDate() == null || Utils.compararFechas(dpFechaFin.getDate(),asignacion.getFechainicial()) >= 0)
                    && (dpFechaInicio.getDate() == null || Utils.compararFechas(dpFechaInicio.getDate(),asignacion.getFechafinal()) <= 0)
                    && (activa || asignacion.getEstado() != ACTIVA)
                    && (completada || asignacion.getEstado() != COMPLETADA)
                    && (pendiente || asignacion.getEstado() != PENDIENTE)
                    && (enUso || asignacion.getEstado() != EN_USO)) {
                listaAsignacionesBuscadas.add(asignacion);
            }
        }
    }

    private void tblAsignacionesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblAsignacionesMouseClicked
        // TODO add your handling code here:
        if (evt.getClickCount() == 2) {
            int row = tblAsignaciones.getSelectedRow();
            modelos.Asignacion asignacion = listaAsignacionesBuscadas.get(row);
            ArrayList<modelos.Asignacionxempleado> listaDetalle = ControladorProduccion.
                    buscarAsignacionxempleado(asignacion.getIdasignacion());
            ArrayList<modelos.Asignacionxproducto> listaProductos =
                    ControladorProduccion.buscarAsignacionxproducto(asignacion.getIdasignacion());


            //FALTA PASAR LA LISTA DE PRODUCTOS, FECHA DE INICIO Y FECHA DE FIN
            AsignacionDetalle ventanaAsignacion = new AsignacionDetalle(asignacion,
                    listaDetalle, listaProductos, false,null);
            getDesktopPane().add(ventanaAsignacion);
            ventanaAsignacion.setVisible(true);

        }
    }//GEN-LAST:event_tblAsignacionesMouseClicked

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        int row = tblAsignaciones.getSelectedRow();
        if (row != -1) {
            modelos.Asignacion asignacion=listaAsignacionesBuscadas.get(row);
            ControladorProduccion.refrescarObjeto(asignacion);
            if (asignacion.getEstado() == COMPLETADA
                    || asignacion.getEstado() == EN_USO) {
                JOptionPane.showMessageDialog(null, "No se puede eliminar una asignacion en estado COMPLETA", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
            } else if (JOptionPane.showConfirmDialog(rootPane, "¿Desea realmente eliminar esta asignacion?",
                    "Mensaje", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                String res = ControladorProduccion.eliminarAsignacion(asignacion);
                if (res == null) {
                    listaAsignaciones = ControladorProduccion.seleccionarAsignaciones();
                } else {
                    JOptionPane.showMessageDialog(null, res, "Mensaje", JOptionPane.INFORMATION_MESSAGE);
                }
                ActualizarDatos();
            }
        } else {
            JOptionPane.showMessageDialog(null, "Seleccione un producto para eliminarlo.", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_jButton2ActionPerformed

    public void RefrescarTabla() {
        ((AbstractTableModel) tblAsignaciones.getModel()).fireTableDataChanged();
    }

    public void ActualizarDatos() {
        listaAsignaciones = ControladorProduccion.seleccionarAsignaciones();
        buscarAsignaciones();
        RefrescarTabla();
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnBuscar;
    private javax.swing.JButton btnNuevo;
    private javax.swing.JCheckBox cbActiva;
    private javax.swing.JCheckBox cbCompletada;
    private javax.swing.JCheckBox cbEnUso;
    private javax.swing.JCheckBox cbPendiente;
    private com.toedter.calendar.JDateChooser dpFechaFin;
    private com.toedter.calendar.JDateChooser dpFechaInicio;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tblAsignaciones;
    // End of variables declaration//GEN-END:variables
}
